{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "自然语言处理（Natural Language Processing，简称NLP）被誉为人工智能皇冠上的明珠，是计算机科学和人工智能领域的一个重要方向。它主要研究人与计算机之间，使用自然语言进行有效通信的各种理论和方法。简单来说，计算机以用户的自然语言形式作为输入，在其内部通过定义的算法进行加工、计算等系列操作后（用以模拟人类对自然语言的理解），再返回用户所期望的结果，如 **图1** 所示。\n",
    "<br></br>\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/38547eddb5374467a209fd9dafa2029a27f8709d62684c2c87af0361988bf28b\" width=\"\" ></center>\n",
    "<center><br>图1：自然语言处理示意图 </br></center>\n",
    "<br></br>\n",
    "\n",
    "自然语言处理是一门融语言学、计算机科学和数学于一体的科学。它不仅限于研究语言学，而是研究能高效实现自然语言理解和自然语言生成的计算机系统，特别是其中的软件系统，因此它是计算机科学的一部分。\n",
    "\n",
    "随着计算机和互联网技术的发展，自然语言处理技术在各领域广泛应用，如 **图2** 所示。在过去的几个世纪，工业革命用机械解放了人类的双手，在当今的人工智能革命中，计算机将代替人工，处理大规模的自然语言信息。我们平时常用的搜索引擎，新闻推荐，智能音箱等产品，都是以自然语言处理技术为核心的互联网和人工智能产品。\n",
    "\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/181a3d07632f42ea9c76dba7842553a08fd6d8aafabb4462893e4c06473f6d76\" width=\"800\" ></center>\n",
    "<center><br>图2：自然语言处理技术在各领域的应用</br></center>\n",
    "<br></br>\n",
    "\n",
    "此外，自然语言处理技术的研究也在日新月异变化，每年投向ACL（Annual Meeting of the Association for Computational Linguistics，计算语言学年会，自然语言处理领域的顶级会议）的论文数成倍增长，自然语言处理的应用效果被不断刷新，有趣的任务和算法更是层出不穷。\n",
    "\n",
    "本节为您简要介绍自然语言处理的发展历程、主要挑战，以及如何使用飞桨快速完成各项常见的自然语言处理任务。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "------\n",
    "### 致命密码：一场关于语言的较量\n",
    "\n",
    "事实上，人们并非只在近代才开始研究和处理自然语言，在漫长的历史长河中，对自然语言妥当处理往往决定了战争的胜利或是政权的更迭。\n",
    "\n",
    "16世纪的英国大陆，英格兰和苏格兰刚刚完成统一，统治者为英格兰女王伊丽莎白一世，苏格兰女王玛丽因被视为威胁而遭到囚禁。玛丽女王和其他苏格兰贵族谋反，这些贵族们通过信件同被囚禁的玛丽女王联络，商量如何营救玛丽女王并推翻伊丽莎白女王的统治。为了能更安全地跟同伙沟通，玛丽使用了一种传统的文字加密形式 - 凯撒密码对她们之间的信件进行加密，如 **图3** 所示。\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/b502e9568cc7444c89ea215569d8995a8d5bb3b5bb8549f9a2ecef39fbdf7302\" width=\"400\" ></center>\n",
    "<center><br>图3：凯撒密码</br></center>\n",
    "<br></br>\n",
    "\n",
    "这种密码通过把原文中的每个字母替换成另外一个字符的形式，达到加密手段。然而他们的阴谋活动早在英格兰贵族监控之下，英格兰国务大臣弗朗西斯·沃尔辛厄姆爵士通过统计英文字母的出现频率和玛丽女王密函中的字母频率，找到了破解密码的规律。最终，玛丽和其他贵族在举兵谋反前夕被捕。这是近代西方第一次破译密码，开启了近现代密码学的先河。\n",
    "\n",
    "------"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 自然语言处理的发展历程\n",
    "\n",
    "自然语言处理有着悠久的发展史，可粗略地分为兴起、符号主义、连接主义和深度学习四个阶段，如 **图4** 所示：\n",
    "\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/4c02304cb8034879a878293179817b38a5ea8eed31f740d5946eb5cdd21d7643\" width=\"800\" ></center>\n",
    "<center><br>图4：自然语言处理的发展历程</br></center>\n",
    "\n",
    "## 兴起时期\n",
    "\n",
    "大多数人认为，自然语言处理的研究兴起于1950年前后。在二战中，破解纳粹德国的恩尼格玛密码成为盟军对抗纳粹的重要战场。经过二战的洗礼，曾经参与过密码破译的香农和图灵等科学家开始思考自然语言处理和计算之间的关系。\n",
    "\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/f62bd94ea2aa46148f213ce73382504d526c044424a846b58272b1b68959f3be\" width=\"200\" ></center>\n",
    "<center><br>图5：恩尼格玛密码机</br></center>\n",
    "<br></br>\n",
    "\n",
    "1948年香农把马尔可夫过程模型（Markov Progress）应用于建模自然语言，并提出把热力学中“熵”（Entropy）的概念扩展到自然语言建模领域。香农相信，自然语言跟其他物理世界的信号一样，是具有统计学规律的，通过统计分析可以帮助我们更好地理解自然语言。\n",
    "\n",
    "1950年，艾伦图灵提出著名的图灵测试，标志着人工智能领域的开端。二战后，受到美苏冷战的影响，美国政府开始重视机器自动翻译的研究工作，以便于随时监视苏联最新的科技进展。1954年美国乔治城大学在一项实验中，成功将约60句的俄文自动翻译成英文，被视为机器翻译可行的开端。自此开始的十年间，政府与企业相继投入大量的资金，用于机器翻译的研究。\n",
    "\n",
    "1956年，乔姆斯基（Chomsky）提出了“生成式文法”这一大胆猜想，他假设在客观世界存在一套完备的自然语言生成规律，每一句话都遵守这套规律而生成。总结出这个客观规律，人们就掌握了自然语言的奥秘。从此，自然语言的研究就被分为了以语言学为基础的符号主义学派，以及以概率统计为基础的连接主义学派。\n",
    "\n",
    "## 符号主义时期\n",
    "\n",
    "在自然语言处理发展的兴起阶段，大量的研究工作都聚焦从语言学角度，分析自然语言的词法、句法等结构信息，并通过总结这些结构之间的规则，达到处理和使用自然语言的目的。这一时期的代表人物就是乔姆斯基和他提出的“生成式文法”。1966年，完全基于规则的对话机器人ELIZA在MIT人工智能实验室诞生了，如 **图6** 所示。\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/3959278875cc43a5a75a00a129a8291a59bb244039354107a507812477210dd5\" width=\"500\" ></center>\n",
    "<center><br>图6：基于规则的聊天机器人ELIZA</br></center>\n",
    "<br></br>\n",
    "然而同年，ALPAC（Automatic Language Processing Advisory Committee，自动语言处理顾问委员会）提出的一项报告中提出，十年来的机器翻译研究进度缓慢、未达预期。该项报告发布后，机器翻译和自然语言的研究资金大为减缩，自然语言处理和人工智能的研究进入寒冰期。\n",
    "\n",
    "## 连接主义时期\n",
    "\n",
    "1980年，由于计算机技术的发展和算力的提升，个人计算机可以处理更加复杂的计算任务，自然语言处理研究得以复苏，研究人员开始使用统计机器学习方法处理自然语言任务。\n",
    "\n",
    "起初研究人员尝试使用浅层神经网络，结合少量标注数据的方式训练模型，虽然取得了一定的效果，但是仍然无法让大部分人满意。后来研究者开始使用人工提取自然语言特征的方式，结合简单的统计机器学习算法解决自然语言问题。其实现方式是基于研究者在不同领域总结的经验，将自然语言抽象成一组特征，使用这组特征结合少量标注样本，训练各种统计机器学习模型（如支持向量机、决策树、随机森林、概率图模型等），完成不同的自然语言任务。\n",
    "\n",
    "由于这种方式基于大量领域专家经验积累（如解决一个情感分析任务，那么一个很重要的特征就是是否有命中情感词表），以及传统计机器学习简单、鲁棒性强的特点，这个时期神经网络技术被大部分人所遗忘。\n",
    "\n",
    "\n",
    "## 深度学习时期\n",
    "\n",
    "从2006年深度神经网络反向传播算法的提出开始，伴随着互联网的爆炸式发展和计算机（特别是GPU）算力的进一步提高，人们不再依赖语言学知识和有限的标注数据，自然语言处理领域迈入了深度学习时代。\n",
    "\n",
    "基于互联海量数据，并结合深度神经网络的强大拟合能力，人们可以非常轻松地应对各种自然语言处理问题。越来越多的自然语言处理技术趋于成熟并显现出巨大的商业价值，自然语言处理和人工智能领域的发展进入了鼎盛时期。\n",
    "\n",
    "自然语言处理的发展经历了多个历史阶段的演进，不同学派之间相互补充促进，共同推动了自然语言处理技术的快速发展。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 自然语言处理技术面临的挑战\n",
    "\n",
    "如何让机器像人一样，能够准确理解和使用自然语言？这是当前自然语言处理领域面临的最大挑战。为了解决这一问题，我们需要从语言学和计算两个角度思考。\n",
    "\n",
    "## 语言学角度\n",
    "\n",
    "自然语言数量多、形态各异，理解自然语言对人来说本身也是一件复杂的事情，如同义词、情感倾向、歧义性、长文本处理、语言惯性表达等。通过如下几个例子，我们一同感受一下。\n",
    "\n",
    "### 同义词问题\n",
    "\n",
    "请问下列词语是否为同义词？（题目来源：四川话和东北话6级模拟考试）\n",
    "   \n",
    "   > 瓜兮兮 和 铁憨憨\n",
    "   >\n",
    "   > 嘎嘎 和 肉（you）\n",
    "   >\n",
    "   > 磕搀 和 难看\n",
    "   >\n",
    "   > 吭呲瘪肚 和 速度慢 \n",
    "  \n",
    "### 情感倾向问题\n",
    "\n",
    "请问如何正确理解下面两个场景？\n",
    "   \n",
    "   场景一：朋友生气了，男朋友电话道歉\n",
    "   \n",
    "   > 女生：就算你买包我也不会原谅你！\n",
    "   >\n",
    "   > 男生：宝贝，放心，我不买，你别生气了。\n",
    "   >\n",
    "   > 问：女生会不会生气。\n",
    "   \n",
    "   场景二：两个人同宿舍的室友甲和乙对话\n",
    "   >\n",
    "   > 甲：钥匙好像没了，你把锁别别\n",
    "   >\n",
    "   > 乙：到底没没没\n",
    "   >\n",
    "   > 甲：我也不道没没没\n",
    "   >\n",
    "   > 乙：要没没你让我别，别别了，别秃鲁了咋整。\n",
    "   >\n",
    "   > 问：到底别不别？\n",
    "   \n",
    "### 歧义性问题\n",
    "\n",
    "请问如何理解下面三句话？\n",
    "\n",
    "   > 一行行行行行，一行不行行行不行\n",
    "   >\n",
    "   > 来到杨过曾经生活过的地方，小龙女说：“我也想过过过儿过过的生活”\n",
    "   >\n",
    "   > 来到儿子等校车的地方，邓超对孙俪说：“我也想等等等等等过的那辆车”\n",
    "\n",
    "相信大多数人都需要花点脑筋去理解上面的句子，在不同的上下文中，相同的单词可以具有不同的含义，这种问题我们称之为歧义性问题。\n",
    "###  对话/篇章等长文本处理问题\n",
    "\n",
    "在处理长文本（如一篇新闻报道，一段多人对话，甚至于一篇长篇小说）时，需要经常处理各种省略、指代、话题转折和切换等语言学现象，如 **图7** 所示，都给机器理解自然语言带来了挑战。\n",
    "   \n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/705737c8851d48c193edab76f05f7cfd51a698e51da141fb909ec4b536c4d8bf\" width=\"800\" ></center>\n",
    "<center><br>图7：多轮对话中的指代和省略</br></center>\n",
    "<br></br>\n",
    "\n",
    "### 探索自然语言理解的本质问题\n",
    "\n",
    "   > 研表究明，汉字的顺序并不定一能影阅响读，比如当你看完这句话后，才发这现里的字全是都乱的。\n",
    "\n",
    "上面这句话从语法角度来说完全是错的，但是对大部分人来说完全不影响理解，甚至很多人都不会意识到这句话的语法是错的。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 计算角度\n",
    "\n",
    "自然语言技术的发展除了受语言学的制约外，在计算角度也天然存在局限。顾名思义，计算机是计算的机器，现有的计算机都以浮点数为输入和输出，擅长执行加减乘除类计算。自然语言本身并不是浮点数，计算机为了能存储和显示自然语言，需要把自然语言中的字符转换为一个固定长度（或者变长）的二进制编码，如 **图8** 所示。\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/6626da7e157c4eb69d16ae87ca17d8ddb27d079899bf42e3ac42573ab00a2af8\" width=\"700\" ></center>\n",
    "<center><br>图8：计算机计算自然语言流程</br></center>\n",
    "<br></br>\n",
    "\n",
    "由于这个编码本身不是数字，对这个编码的计算往往不具备数学和物理含义。例如：把“法国”和“首都”放在一起，大多数人首先联想到的内容是“巴黎”。但是如果我们使用“法国”和“首都”的UTF-8编码去做加减乘除等运算，是无法轻易获取到“巴黎”的UTF-8编码，甚至无法获得一个有效的UTF-8编码。因此，如何让计算机可以有效地计算自然语言，是计算机科学家和工程师面临的巨大挑战。\n",
    "\n",
    "此外，目前也有研究人员正在关注自然语言处理方法中的社会问题：包括自然语言处理模型中的偏见和歧视、大规模计算对环境和气候带来的影响、传统工作被取代后，人的失业和再就业问题等。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 自然语言处理的常见任务\n",
    "\n",
    "自然语言处理是是非常复杂的领域，是人工智能中最为困难的问题之一，常见的任务如 **图9** 所示：\n",
    "\n",
    "<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/130ded82f3d341f0848a957a11f1e416986ed0497ebc4b68b57f5367c6eca5bd\" width=\"800\" ></center>\n",
    "<center><br>图9：自然语言处理常见任务</br></center>\n",
    "<br></br>\n",
    "\n",
    "- **词和短语级任务**：包括切词、词性标注、命名实体识别（如“苹果很好吃”和“苹果很伟大”中的“苹果”哪个是苹果公司？）、同义词计算（如“好吃”的同义词是什么？）等以词为研究对象的任务。\n",
    "- **句子和段落级任务**：包括文本倾向性分析（如客户说：“你们公司的产品真好用！”是在夸赞还是在讽刺？）、文本相似度计算（如“我坐高铁去广州”和“我坐火车去广州”是一个意思吗？）等以句子为研究对象的任务。\n",
    "- **对话和篇章级任务**：包括机器阅读理解（如使用医药说明书回答患者的咨询问题）、对话系统（如打造一个24小时在线的AI话务员）等复杂的自然语言处理系统等。\n",
    "- **自然语言生成**：如机器翻译（如“我爱飞桨”的英文是什么？）、机器写作（以AI为题目写一首诗）等自然语言生成任务。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 使用飞桨探索自然语言处理\n",
    "\n",
    "接下来，让我们一起探索几个经典的自然语言处理任务，包括：\n",
    "\n",
    "* 计算词语之间的关系（如同义词）：word2vec\n",
    "* 理解一个自然语言句子：文本分类和相似度计算\n",
    "\n",
    "一般来说，使用飞桨完成自然语言处理任务时，都可以遵守一个相似的套路，包括：\n",
    "\n",
    "![](https://ai-studio-static-online.cdn.bcebos.com/44976c9b44664a038787b5752fe047b3e3d311ff881242a2a36f3a107c5b3f58)\n",
    "\n",
    "1. 学习基础支持：先学习一下基础知识，包括问题定义，网络结构，数据集格式和含义等。\n",
    "1. 处理数据：准备所需要的数据，将数据处理成神经网络可以计算的形式。\n",
    "1. 实现网络：使用飞桨定义出神经网络的结构，包括输入层，中间层（又叫隐层）和输出层，特别的，还需要定义好神经网络的损失函数和优化器，便于网络训练。\n",
    "1. 模型训练：将准备好的数据逐个送入神经网络中，进行训练，并在训练中观察网络是否正常收敛。\n",
    "1. 评估和上线：把训练好的网络保存起来，并使用测试集测试网络的效果，并根据测试效果反复迭代，直到到达应用要求为止。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 思考一下\n",
    "\n",
    "[1] 你生活中有哪些地方使用了自然语言处理？\n",
    "\n",
    "[2] 你希望如何应用自然语言处理？"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 引用\n",
    "\n",
    "[1] [百度百科：玛丽女王的密码](https://baike.baidu.com/item/玛丽女王的密码)\n",
    "\n",
    "[2] [ACL2019:The Bright Future of ACL/NLP](https://www.microsoft.com/en-us/research/uploads/prod/2019/08/ACL-MingZhou-50min-ming.v9.pdf)\n",
    "\n",
    "[3] [百度百科：自然语言处理](https://baike.baidu.com/item/自然语言处理)\n",
    "\n",
    "[4] [维基百科：自然语言处理](https://zh.wikipedia.org/zh/自然语言处理)\n",
    "\n",
    "[5] [百度百科：机器翻译](https://baike.baidu.com/item/机器翻译)\n",
    "\n",
    "[6] [百度百科：克劳德·艾尔伍德·香农](https://baike.baidu.com/item/克劳德·艾尔伍德·香农?fromtitle=香农&fromid=1146248)\n",
    "\n",
    "[7] [维基百科：恩尼格玛密码机](https://zh.wikipedia.org/wiki/恩尼格玛密码机)\n",
    "\n",
    "[8] [维基百科：艾伦图灵](https://zh.wikipedia.org/wiki/艾伦·图灵)\n",
    "\n",
    "[9] [维基百科：图灵测试](https://zh.wikipedia.org/wiki/图灵测试)\n",
    "\n",
    "[10] [维基百科：ELIZA](https://en.wikipedia.org/wiki/ELIZA)\n",
    "\n",
    "[11] [维基百科：反向传播算法](https://zh.wikipedia.org/zh-hans/反向传播算法)\n",
    "\n",
    "[12] [玛丽女王的密码](http://xiamag.com/54453.html)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PaddlePaddle 1.6.0 (Python 3.5)",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
